home *** CD-ROM | disk | FTP | other *** search
/ Collection of Internet / Collection of Internet.iso / infosrvr / doc / www_talk.arc / 000190_connolly@pixel.convex.com _Fri Jul 24 07:19:47 1992.msg < prev    next >
Internet Message Format  |  1992-11-30  |  7KB

  1. Return-Path: <connolly@pixel.convex.com>
  2. Received: from dxmint.cern.ch by  nxoc01.cern.ch  (NeXT-1.0 (From Sendmail 5.52)/NeXT-2.0)
  3.     id AA23830; Fri, 24 Jul 92 07:19:47 MET DST
  4. Received: by dxmint.cern.ch (dxcern) (5.57/3.14)
  5.     id AA18179; Fri, 24 Jul 92 07:19:25 +0200
  6. Received: from pixel.convex.com by convex.convex.com (5.64/1.35)
  7.     id AA16637; Fri, 24 Jul 92 00:18:36 -0500
  8. Received: from localhost by pixel.convex.com (5.64/1.28)
  9.     id AA06296; Fri, 24 Jul 92 00:18:35 -0500
  10. Message-Id: <9207240518.AA06296@pixel.convex.com>
  11. To: www-talk@nxoc01.cern.ch
  12. Subject: html2mml.l -- FrameMaker support for HTML
  13. Content-Type: multipart/mixed; boundary="cut-here"
  14. Date: Fri, 24 Jul 92 00:18:34 CDT
  15. From: Dan Connolly <connolly@pixel.convex.com>
  16.  
  17. --cut-here
  18.  
  19. Here's a lisp program I cooked up to convert HTML files
  20. to Frame's Maker Markup Language. It uses a real SGML
  21. parser and a lisp interpreter, so you'll have to build
  22. those if you don't have them handy.
  23.  
  24. I haven't tested it extensively, and I don't have a
  25. down translator (MIF to HTML) yet... but I thought
  26. I'd pass it along.
  27.  
  28. Oh... it assumes the HTML file conforms to the DTD
  29. I sent out a while ago (I'd give you a WWW HREF/URL,
  30. but the server's down right now and I can't find
  31. it.)
  32.  
  33. Dan
  34.  
  35. --cut-here
  36.  
  37. ;;; html2mml.l -- translate HyperText Markup Language to Maker Markup Language.
  38. ;;;
  39. ;;; USE
  40. ;;;  sgmls file.html | xlisp html2mml.l >file.mml
  41. ;;;
  42. ;;; Where xlisp is Tom Almy's improved release of David Betz's XLISP 2.1,
  43. ;;; available in export.lcs.mit.edu:/contrib/winterp/xlisp/xlisp-2.1.almy.tar.Z
  44. ;;; and sgmls is built from
  45. ;;; ifi.uio.no:/pub/SGML/SGMLS/sgmls-0.8.tar
  46. ;;; aka
  47. ;;; ftp.uu.net:/pub/text-processing/sgml/sgmls-0.8.tar.Z
  48. ;;;
  49. ;;; The resulting file will have the OS Banner from XLisp at the
  50. ;;; top. For some reason, XLisp writes everything to stdout.
  51. ;;; I patched it to write diagnostic output to stderr. I'll have
  52. ;;; to get the patches incorporated soon.
  53. ;;;
  54. ;;; Anyway, just edit the banner out so the first line of the file is
  55. ;;; <MML ...>
  56. ;;;
  57. ;;; Then import the mml file to FrameMaker.
  58. ;;;
  59.  
  60. (setq *tracenable* t)
  61. (setq *breakenable* t)
  62.  
  63. (princ "<MML \"from html2mml.l by connolly@convex.com\">\n")
  64. (setq *para-tags*
  65.       '(title h1 h2 h3 h4 h5 body ol ul dl menu dir xmp listing))
  66. (setq *literal-tags* '(xmp listing))
  67.  
  68. (setq *style-sheet* "
  69. <!DefinePar Title
  70.   <Alignment r>
  71.   <plain> <pts 18> <bold>
  72. >
  73. <!DefinePar H1
  74.   <Alignment c>
  75.   <plain><pts 18>
  76.   <SpaceBefore 12pt><SpaceAfter 12pt>
  77. >
  78. <!DefinePar H2
  79.   <LeftIndent 0in><FirstIndent 0in>
  80.   <SpaceBefore 12pt><SpaceAfter 6pt>
  81.   <Alignment l>
  82.   <plain><pts 14>
  83. >
  84. <!DefinePar H3
  85.   <plain> <bold>
  86.   <LeftIndent 0.25in><FirstIndent 0.25in>
  87.   <SpaceBefore 6pt><SpaceAfter 3pt>
  88.   <Alignment l><pts 12>
  89. >
  90. <!DefinePar H4
  91.   <Alignment l>
  92. >
  93. <!DefinePar H5
  94.   <Alignment l>
  95. >
  96. <!DefinePar BODY
  97.   <LeftIndent 0.75in><FirstIndent 0.75in>
  98.   <SpaceBefore 3pt><SpaceAfter 3pt><BlockSize 3>
  99.   <Alignment l><plain><pts 12>
  100. >
  101. <!DefinePar OL
  102.   <FirstIndent 1.0in> <LeftIndent 1.5in>
  103.   <TabStops <TabStop 1.25in>>
  104.   <SpaceBefore 3pt><SpaceAfter 3pt><BlockSize 3>
  105.   <AutoNumber Yes> <NumberFormat \"<n+>\t\">
  106.   <Alignment l><plain><pts 12>
  107. >
  108. <!DefinePar UL
  109.   <SpaceBefore 3pt><SpaceAfter 3pt><BlockSize 3>
  110.   <FirstIndent 1.0in> <LeftIndent 1.5in>
  111.   <TabStops <TabStop 1.25in>>
  112.   <AutoNumber Yes> <NumberFormat \"o\\t\">
  113.   <Alignment l><plain><pts 12>
  114. >
  115. <!DefinePar DL
  116.   <AutoNumber No>
  117.   <SpaceBefore 3pt><SpaceAfter 3pt><BlockSize 3>
  118.   <FirstIndent 0.5in> <LeftIndent 2.5in>
  119.   <TabStops <TabStop 2.5in>>
  120.   <Alignment l><plain><pts 12>
  121. >
  122. <!DefinePar MENU
  123.   <AutoNumber No>
  124.   <WithNext yes><WithPrev yes>
  125.   <Alignment l><plain><pts 12>
  126. >
  127. <!DefinePar DIR
  128.   <AutoNumber No>
  129.   <Alignment l><plain><pts 12>
  130. >
  131. <!DefinePar XMP
  132.   <AutoNumber No>
  133.   <FirstIndent 0in> <LeftIndent 0in>
  134.   <Alignment l><plain>
  135.   <Family Courier><pts 9>
  136.   <SpaceBefore 3pt><SpaceAfter 3pt><BlockSize 3>
  137. >
  138. <!DefinePar LISTING
  139.   <AutoNumber No>
  140.   <FirstIndent 0in> <LeftIndent 0in>
  141.   <Alignment l><plain>
  142.   <Family Courier><pts 8>
  143.   <SpaceBefore 3pt><SpaceAfter 3pt><BlockSize 3>
  144. >
  145. ")
  146.  
  147. (princ *style-sheet*)
  148.  
  149. ;; From almy2.1
  150. ;; push and pop treat variable v as a stack
  151. (defmacro push (v l)
  152.         `(setf ,l (cons ,v ,l)))
  153.  
  154. (defmacro pop (l)
  155.         `(prog1 (first ,l) (setf ,l (rest ,l))))
  156.  
  157.  
  158. (defun start-para (stream tag)
  159.   (format stream "<~A>~%" tag)
  160.   )
  161.  
  162. (defun end-para (stream)
  163.   (format stream "~%~%")
  164.   )
  165.  
  166.  
  167. (defun convert-data (literal)
  168.   (do ((c (read-char) (read-char))
  169.        d1 d2 d3
  170.        )
  171.       ((eq c #\Newline) nil)
  172.       
  173.       (cond ((eq c #\\)
  174.          (cond ((setf d1 (digit-char-p (setf c (read-char))))
  175.             (setf d2 (digit-char-p (read-char))) 
  176.             (setf d3 (digit-char-p (read-char)))
  177.             (princ (int-char (+ d3 (* 8 (+ d2 (* 8 d1))))))
  178.             )
  179.            ((eq c #\\) (princ "\\\\"))
  180.            ((eq c #\n) (format t (if literal "<HardReturn>" " ")))
  181.            ((eq c #\|) ;;nothing
  182.             )
  183.            ((eq c #\s) (princ " "))
  184.            ) )
  185.         ((member c '(#\< #\>)) (format t "\\~A" c))
  186.         ((eq c #\space) (format t (if literal "<HardSpace>" " ")))
  187.         ((eql c 7) (format t "<tab>"))
  188.         (t (princ c))
  189.     ) ) )
  190.  
  191. (defun html2mml ()
  192.   (do ((c (read-char) (read-char))
  193.        stack
  194.        tag
  195.        attrs
  196.        )
  197.       ((null c)) ;; quit at end of file
  198.       
  199.       (case c
  200.         (#\Newline ;; do nothing
  201.          )
  202.         
  203.         (#\( (let ((gi (read))
  204.                )
  205.            ;; open tag
  206.            (push gi stack)
  207.            (cond ((member gi *para-tags*)
  208.               (setq tag gi)
  209.               (start-para t tag)
  210.               )
  211.              ((eq gi 'a)
  212.               (let ((href (second (assoc 'href attrs)))
  213.                 )
  214.                 ;; watch out for >'s and 's
  215.                 (format t "<Marker <MType 8> <MText `message www ~A'>><italic>" href)
  216.                 )
  217.               )
  218.              )
  219.            (setq attrs nil)
  220.            ))
  221.         (#\) (let ((gi (read))
  222.                )
  223.            (pop stack)
  224.            (cond ((member gi *para-tags*)
  225.               (setq tag nil))
  226.              ((eq gi 'a) (format t "<noitalic>"))
  227.              ((eq gi 'dt) (format t "<tab>"))
  228.              ((member gi '(p dd li)) (format t "<par>"))
  229.              )
  230.            ))
  231.         
  232.         (#\-
  233.          (unless tag
  234.              (end-para t)
  235.              (dolist (gi stack)
  236.                  (when (member gi *para-tags*)
  237.                    (setq tag gi)
  238.                    (return)
  239.                    ) )
  240.              (start-para t tag)
  241.              )
  242.          (convert-data (member tag *literal-tags*))
  243.          )
  244.         
  245.         (#\& (let ((name (read))
  246.                )
  247.            ;; name
  248.            ))
  249.         
  250.         (#\? (let ((pi (read-line))
  251.                )
  252.            ;; processing instruction
  253.            ))
  254.         (#\A (let ((name (read))
  255.                (token (read))
  256.                )
  257.            (case token
  258.              (IMPLIED ;; nothing
  259.               )
  260.              (CDATA (let ((data (read-line))
  261.                       )
  262.                   (push (list name data) attrs)
  263.                   ))
  264.              (TOKEN (let ((tokens (read-line)) ;;@@ read tokens til \n
  265.                       )
  266.                   ;; tokens
  267.                   ))
  268.              (NOTATION (let ((name (read))
  269.                      )
  270.                      ;; notation
  271.                      ))
  272.              (ENTITY (let ((name (read))
  273.                        )
  274.                    ;; general entity
  275.                    ))
  276.              (ID (let ((id (read))
  277.                    )
  278.                    ;; id
  279.                    ))
  280.              (IDREF (let ((ids (read-line)) ;; @@ read ids til \n
  281.                       )
  282.                   ;; id's
  283.                   ))
  284.              ) ) )
  285.         
  286.         (#\D (read-line) ;; do like A but for external data name
  287.          )
  288.         ) )
  289.   )
  290.  
  291. (html2mml)
  292.  
  293. --cut-here--
  294.